//
//  RunTimeViewController.h
//  ReviewDemo
//
//  Created by 龙 on 2018/3/14.
//  Copyright © 2018年 long. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface RunTimeViewController : UIViewController

@end

/*
 https://www.jianshu.com/p/19f280afcb24
 
 一、runtime简介:
    runtime简称运行时，OC就是运行机制，也就是在运行时候的一些机制，其中最主要的是消息机制。
    对于C语言，函数的调用在编译的时候回决定调用哪个函数
    对于OC的函数，属于动态调用过程，在编译的时候并不能决定真正调用哪个函数，只有在真正运行的时候才会根据函数的名称找到对应的函数来调用
 
二、消息机制：
   2.1 消息机制原理：
       方法调用本质：让对象发送消息
       objc_msgSend只有对象才能发送消息，故以objc开头
   2.2 消息调用流程：
       （1）、通过 isa 指针去对应的类中查找
       （2）、注册方法编号
       （3）、根据方法编号去查找对应方法
       （4）、找的的只是最终函数实现地址，根据地质去方法区调用对应函数
        注意：<1>、当发送消息给实例对象时，消息是在寻找这个对象的类的方法列表(实例方法)
             <2>、当发送消息给类对象时，消息是在寻找这个类的元类的方法列表(类方法)
 
 三、常用开发场景
    3.1 UITextField占位文字的颜色以及字体大小（新建Category，关联Placeholder的Color属性）
        [_textField setValue:kFont(14) forKeyPath:@"_placeholderLabel.font"];
        [_textField setValue:kThemeColor forKeyPath:@"_placeholderLabel.textColor"];
    3.2 给分类动态添加属性
        注意：我们知道在分类中是不能够添加成员属性的，虽然我们用了@property，但是仅仅会自动生成get和set方法的声明，并没有带下划线的属性和方法实现生成。但是我们可以通过runtime就可以做到给它方法的实现。
        属性赋值的本质：就是让属性与一个对象产生关联，所以要给NSObject的分类的name属性赋值就是让name和NSObject产生关联，而runtime可以做到这一点。
   3.3 给分类动态添加方法：处理调用一个未实现的方法 和 去除报错(unrecognized selector sent to instance)
       三次补救措施：
       (第一次)、+ (BOOL)resolveInstanceMethod:(SEL)sel {} (实例方法)；
               + (BOOL)resolveClassMethod:(SEL)sel {}  (类方法)
               在上面方法中，利用 class_addMethod 方法，将未实现的 method: 绑定到 myMethod 上就能完成转发，最后返回 YES。
       (第二次)、
       (第三次)、
   3.4 使用runtime实现自动归档和解档：class_copyIvarList返回类的所有属性和变量
   3.5 方法交换：系统自带的方法功能不够，给系统自带的方法扩展一些功能，并且保持原有的功能
   3.6 利用runtime进行实用性封装
       (1)、UIAlertView的封装
       (2)、Method Swizzling方法交换封装
       (3)、UIButton 防连击
       (4)、UINavigationItem 左侧返回按钮自定义
       (5)、打印类信息 重写 description 方法
   3.7 将Json 数据转换为 Model
   3.8 两个接口同样数据不同的字段名处理 
   

 
 四、IMP指针
    IMP就是Implementation的缩写，顾名思义，它是指向一个方法实现的指针
 注解：OC 中我们很习惯的会用懒加载，当用到的时候才去加载它，但是实际上只要一个类实现了某个方法，就会被加载进内存。
  */
